package main

// FixPositiveTurn 顺时针旋转90度
func (f *Info) FixPositiveTurn(fix, x, y, z int) (int, int, int) {
	if (x < One || x > Three) || (y < One || y > Three) || (z < One || z > Three) {
		f.logs.Warn("unknown position:", x, y, z)
		f.exit <- f.record
		return x, y, z
	}
	switch fix {
	case One:
		// 第一面顺时针旋转
		// 2,1,2-->2,1,2
		// 2,1,3-->3,1,2-->2,1,1-->1,1,2-->2,1,3
		// 1,1,3-->3,1,3-->3,1,1-->1,1,1-->1,1,3
		if x == Two && z == Two {
			return x, y, z
		}
		if x == Two || z == Two {
			if x == Two && z > Two {
				x += 1
				z -= 1
			}
			if x == Two && z < Two {
				x -= 1
				z += 1
			}
			if x > Two && z == Two {
				x -= 1
				z -= 1
			}
			if x < Two && z == Two {
				x += 1
				z += 1
			}
			return x, y, z
		}
		if x < Two && z < Two {
			z += 2
		}
		if x > Two && z > Two {
			z -= 2
		}
		if x > Two && z < Two {
			x -= 2
		}
		if x < Two && z > Two {
			x += 2
		}
		return x, y, z
	case Two:
		// 第二面顺时针旋转
		// 3,2,2-->3,2,2
		// 3,1,2-->3,2,3-->3,3,2-->3,2,1-->3,1,2
		// 3,1,1-->3,1,3-->3,3,3-->3,3,1-->3,1,1
		if y == Two && z == Two {
			return x, y, z
		}
		if y == Two || z == Two {
			if y == Two && z > Two {
				y += 1
				z -= 1
			}
			if y == Two && z < Two {
				y -= 1
				z += 1
			}
			if y > Two && z == Two {
				y -= 1
				z -= 1
			}
			if y < Two && z == Two {
				y += 1
				z += 1
			}
			return x, y, z
		}
		if y < Two && z < Two {
			z += 2
		}
		if y > Two && z > Two {
			z -= 2
		}
		if y > Two && z < Two {
			y -= 2
		}
		if y < Two && z > Two {
			y += 2
		}
		return x, y, z
	case Three:
		// 第三面顺时针旋转
		// 2,2,1-->2,2,1
		// 2,1,1-->3,2,1-->2,3,1-->1,2,1-->2,1,1
		// 3,1,1-->3,3,1-->1,3,1-->1,1,1-->3,1,1
		if x == Two && y == Two {
			return x, y, z
		}
		if x == Two || y == Two {
			if x == Two && y > Two {
				x -= 1
				y -= 1
			}
			if x == Two && y < Two {
				x += 1
				y += 1
			}
			if x > Two && y == Two {
				x -= 1
				y += 1
			}
			if x < Two && y == Two {
				x += 1
				y -= 1
			}
			return x, y, z
		}
		if x < Two && y < Two {
			x += 2
		}
		if x > Two && y > Two {
			x -= 2
		}
		if x > Two && y < Two {
			y += 2
		}
		if x < Two && y > Two {
			y -= 2
		}
		return x, y, z
	case Four:
		// 第四面顺时针旋转
		// 2,3,2-->2,3,2
		// 2,3,3-->1,3,2-->2,3,1-->3,3,2-->2,3,3
		// 3,3,3-->1,3,3-->1,3,1-->3,3,1-->3,3,3
		if x == Two && z == Two {
			return x, y, z
		}
		if x == Two || z == Two {
			if x == Two && z > Two {
				x -= 1
				z -= 1
			}
			if x == Two && z < Two {
				x += 1
				z += 1
			}
			if x > Two && z == Two {
				x -= 1
				z += 1
			}
			if x < Two && z == Two {
				x += 1
				z -= 1
			}
			return x, y, z
		}
		if x < Two && z < Two {
			x += 2
		}
		if x > Two && z > Two {
			x -= 2
		}
		if x > Two && z < Two {
			z += 2
		}
		if x < Two && z > Two {
			z -= 2
		}
		return x, y, z
	case Five:
		// 第五面顺时针旋转
		// 1,2,2-->1,2,2
		// 1,2,3-->1,1,2-->1,2,1-->1,3,2-->1,2,3
		// 1,1,3-->1,1,1-->1,3,1-->1,3,3-->1,1,3
		if y == Two && z == Two {
			return x, y, z
		}
		if y == Two || z == Two {
			if y == Two && z > Two {
				y -= 1
				z -= 1
			}
			if y == Two && z < Two {
				y += 1
				z += 1
			}
			if y > Two && z == Two {
				y -= 1
				z += 1
			}
			if y < Two && z == Two {
				y += 1
				z -= 1
			}
			return x, y, z
		}
		if y < Two && z < Two {
			y += 2
		}
		if y > Two && z > Two {
			y -= 2
		}
		if y > Two && z < Two {
			z += 2
		}
		if y < Two && z > Two {
			z -= 2
		}
		return x, y, z
	case Six:
		// 第六面顺时针旋转
		// 2,2,3-->2,2,3
		// 1,2,3-->2,3,3-->3,2,3-->2,1,3-->1,2,3
		// 1,1,3-->1,3,3-->3,3,3-->3,1,3-->1,1,3
		if x == Two && y == Two {
			return x, y, z
		}
		if x == Two || y == Two {
			if x == Two && y > Two {
				x += 1
				y -= 1
			}
			if x == Two && y < Two {
				x -= 1
				y += 1
			}
			if x > Two && y == Two {
				x -= 1
				y -= 1
			}
			if x < Two && y == Two {
				x += 1
				y += 1
			}
			return x, y, z
		}
		if x < Two && y < Two {
			y += 2
		}
		if x > Two && y > Two {
			y -= 2
		}
		if x > Two && y < Two {
			x -= 2
		}
		if x < Two && y > Two {
			x += 2
		}
		return x, y, z
	default:
		f.logs.Warn("unknown wall:", fix, "position:", x, y, z)
		return x, y, z
	}
}

// FixNegativeTurn 逆时针旋转90度
func (f *Info) FixNegativeTurn(fix, x, y, z int) (int, int, int) {
	if (x < One || x > Three) || (y < One || y > Three) || (z < One || z > Three) {
		f.logs.Warn("unknown position:", x, y, z)
		f.exit <- f.record
		return x, y, z
	}
	switch fix {
	case One:
		// 第一面逆时针旋转
		// 2,1,2-->2,1,2
		// 2,1,3-->1,1,2-->2,1,1-->3,1,2-->2,1,3
		// 1,1,3-->1,1,1-->3,1,1-->3,1,3-->1,1,3
		if x == Two && z == Two {
			return x, y, z
		}
		if x == Two || z == Two {
			if x == Two && z > Two {
				x -= 1
				z -= 1
			}
			if x == Two && z < Two {
				x -= 1
				z += 1
			}
			if x > Two && z == Two {
				x -= 1
				z += 1
			}
			if x < Two && z == Two {
				x += 1
				z -= 1
			}
			return x, y, z
		}
		if x < Two && z < Two {
			x += 2
		}
		if x > Two && z > Two {
			x -= 2
		}
		if x > Two && z < Two {
			z += 2
		}
		if x < Two && z > Two {
			z -= 2
		}
		return x, y, z
	case Two:
		// 第二面逆时针旋转
		// 3,2,2-->3,2,2
		// 3,1,2-->3,2,1-->3,3,2-->3,2,3-->3,1,2
		// 3,1,1-->3,3,1-->3,3,3-->3,1,3-->3,1,1
		if y == Two && z == Two {
			return x, y, z
		}
		if y == Two || z == Two {
			if y == Two && z > Two {
				y -= 1
				z -= 1
			}
			if y == Two && z < Two {
				y += 1
				z += 1
			}
			if y > Two && z == Two {
				y -= 1
				z += 1
			}
			if y < Two && z == Two {
				y += 1
				z -= 1
			}
			return x, y, z
		}
		if y < Two && z < Two {
			y += 2
		}
		if y > Two && z > Two {
			y -= 2
		}
		if y > Two && z < Two {
			z += 2
		}
		if y < Two && z > Two {
			z -= 2
		}
		return x, y, z
	case Three:
		// 第三面逆时针旋转
		// 2,2,1-->2,2,1
		// 2,1,1-->3,2,1-->2,3,1-->1,2,1-->2,1,1
		// 3,1,1-->3,3,1-->1,3,1-->1,1,1-->3,1,1
		if x == Two && y == Two {
			return x, y, z
		}
		if x == Two || y == Two {
			if x == Two && y > Two {
				x -= 1
				y -= 1
			}
			if x == Two && y < Two {
				x += 1
				y += 1
			}
			if x > Two && y == Two {
				x -= 1
				y += 1
			}
			if x < Two && y == Two {
				x += 1
				y -= 1
			}
			return x, y, z
		}
		if x < Two && y < Two {
			x += 2
		}
		if x > Two && y > Two {
			x -= 2
		}
		if x > Two && y < Two {
			y += 2
		}
		if x < Two && y > Two {
			y -= 2
		}
		return x, y, z
	case Four:
		// 第四面逆时针旋转
		// 2,3,2-->2,3,2
		// 2,3,3-->3,3,2-->2,3,1-->1,3,2-->2,3,3
		// 3,3,3-->3,3,1-->1,3,1-->1,3,3-->3,3,3
		if x == Two && z == Two {
			return x, y, z
		}
		if x == Two || z == Two {
			if x == Two && z > Two {
				x += 1
				z -= 1
			}
			if x == Two && z < Two {
				x -= 1
				z += 1
			}
			if x > Two && z == Two {
				x -= 1
				z -= 1
			}
			if x < Two && z == Two {
				x += 1
				z += 1
			}
		}
		if x < Two && z < Two {
			z += 2
		}
		if x > Two && z > Two {
			z -= 2
		}
		if x > Two && z < Two {
			x -= 2
		}
		if x < Two && z > Two {
			x += 2
		}
		return x, y, z
	case Five:
		// 第五面逆时针旋转
		// 1,2,2-->1,2,2
		// 1,2,3-->1,3,2-->1,2,1-->1,1,2-->1,2,3
		// 1,1,3-->1,3,3-->1,3,1-->1,1,1-->1,1,3
		if y == Two && z == Two {
			return x, y, z
		}
		if y == Two || z == Two {
			if y == Two && z > Two {
				y += 1
				z -= 1
			}
			if y == Two && z < Two {
				y -= 1
				z += 1
			}
			if y > Two && z == Two {
				y -= 1
				z -= 1
			}
			if y < Two && z == Two {
				y += 1
				z += 1
			}
			return x, y, z
		}
		if y < Two && z < Two {
			z += 2
		}
		if y > Two && z > Two {
			z -= 2
		}
		if y > Two && z < Two {
			y -= 2
		}
		if y < Two && z > Two {
			y += 2
		}
		return x, y, z
	case Six:
		// 第六面顺时针旋转
		// 2,2,3-->2,2,3
		// 1,2,3-->2,1,3-->3,2,3-->2,3,3-->1,2,3
		// 1,1,3-->3,1,3-->3,3,3-->1,3,3-->1,1,3
		if x == Two && y == Two {
			return x, y, z
		}
		if x == Two || y == Two {
			if x == Two && y > Two {
				x -= 1
				y -= 1
			}
			if x == Two && y < Two {
				x += 1
				y += 1
			}
			if x > Two && y == Two {
				x -= 1
				y += 1
			}
			if x < Two && y == Two {
				x += 1
				y -= 1
			}
			return x, y, z
		}
		if x < Two && y < Two {
			x += 2
		}
		if x > Two && y > Two {
			x -= 2
		}
		if x > Two && y < Two {
			y += 2
		}
		if x < Two && y > Two {
			y -= 2
		}
		return x, y, z
	default:
		f.logs.Warn("unknown wall:", fix, "position:", x, y, z)
		return x, y, z
	}
}
